#pragma once
#include <arpa/inet.h>
// #include <cstddef>
#include <cstddef>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/epoll.h>
#include <unistd.h>

#define SERVER_PORT 12345
#define BUFF_SIZE 2048 // 缓存区大小
#define HEAD_LEN 4     // 头部长度4字节
#define HEAD_ID_LEN 2  // 头部id长度2字节
#define HEAD_LEN_LEN 2 // 头部长度字段2字节

// 接受状态
enum RecvStage {
    NO_RECV = 0, // 未接受
    HEAD_RECVING,
    BODY_RECVING,
};

// 头部buff
typedef struct {
    // 缓存接受的头部信息
    char *buf;
    // 头部总长度
    size_t data_len;
    // 头部已经接受的偏移量
    size_t offset;
} head_buf_t;
typedef struct {
    uint16_t type;
    char *buf;
    size_t data_len;
    size_t offset;
} data_buf_t;
// head_buf_t *malloc_head_buf(int head_len);
// void dealloc_head_buf(head_buf_t *head_buf);

// 发送数据节点
typedef struct send_node_t {
    // 数据域
    data_buf_t *send_buf;
    // 下一个节点指针
    struct send_node_t *next;
} send_node_t;
// 发送队列
typedef struct {
    // 发送队列头部
    send_node_t *head;
    // 互斥锁，保证多线程访问安全
    pthread_mutex_t send_que_lock;
} send_que_t;
typedef struct {
    // 文件描述符
    int fd;
    // 存储接受的数据包体内容
    data_buf_t *data_buf;
    // 存储未接受完整的头部
    head_buf_t *head_buf;
    // 发送队列
    send_que_t *send_que;
    // 接受阶段,0未开始后接受，1接受头部，2接受包体
    enum RecvStage recv_stage;
} session_t;
